package com.gjy.leetcode;

import org.junit.jupiter.api.Test;

import java.util.Arrays;

/**
 * 283. 移动零
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 * <p>
 * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 *
 * @author 宫静雨
 * @version 1.0
 * @since 2023-01-05 09:02:15
 */
public class A283 {

    @Test
    public void test1() {
        int[] a = {0, 1, 3, 0, 12};
        moveZeroes3(a);
        System.out.println(Arrays.toString(a));
    }

    public void moveZeroes3(int[] nums) {
        int n = nums.length, l = 0, r = 0;
        while (r < n) {
            if (nums[r] != 0) {
                nums[l] = nums[l] ^ nums[r];
                nums[r] = nums[l] ^ nums[r];
                nums[l] = nums[l] ^ nums[r];
                l++;
            }
            r++;
        }
    }

    public void moveZeroes2(int[] nums) {
        int length;
        if (nums == null || (length = nums.length) == 0) {
            return;
        }
        int j = 0;
        for (int i = 0; i < length; i++) {
            if (nums[i] != 0) {
                if (i > j) {
                    nums[j] = nums[i];
                    nums[i] = 0;
                }
                j++;
            }
        }
    }

    public void moveZeroes(int[] nums) {
        int k = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                k++;
            } else {
                if (k > 0) {
                    nums[i - k] = nums[i];
                    nums[i] = 0;
                }
            }
        }
    }
}
